Introduction

R의 끌리는 점 중 하나는 메타프로그래밍을 한다는 점.
이건, 코드 또한 검사되고inspected 수정될 수 있는modified 데이터다. 라는 아이디어

이건 강력한 아이디어다. 많은 R 코드들에 깊은 영향을 줬다.
기초 레벨에서는, library("purrr")이라고 쓰는 대신에 library(purrr)이라고 쓸 수도 있게 해주고,
plot(x, sin(x))라고 하면 축들axes이 자동으로 x, sin(x)로 라벨되게끔 해줌.

더 심화된 레벨에서는, y ~ x1 + x2라고 하면 yx1, x2로 predict하라는 걸 대표하는구나 해줌.
subset(df, x == y)라고 하면 df[df$x == df$y, , drop = FALSE]라고 해석translate해줌.
그리고, dplyr::filter(db, is.na(x))라고 하면 SQL로 WHERE x IS NULL이라는 구문을 만들게끔 해줌.

메타프로그래밍과 밀접하게 관련되어 있는 주제는 non-standard evaluation, 줄여서 NSE.
R 함수의 행동behavior을 표현describe하기 위해서 자주 쓰이는 용어인데, 2가지에서 문제있다.problematic

첫째로, NSE는 사실 함수 인자argument의 특성property이기 때문에, NSE 함수들에 대해 말하는 건 좀 엉성

둘째로, standard한 걸 정의를 하는 것도 아니고, not standard한 걸로 정의를 한다는 건 좀 헷갈리는 일이다.
그래서 좀 더 정확한 단어들을 소개해보겠다.

좀 더 구체적으로, 여기서는 tidy evaluation에 집중했다. (줄여서 tidy eval)
이 tidy evaluation은, rlang 패키지(Henry and Wickham 2018b)에 implement되어 있으며, 챕터에서 광범위하게 쓸 것.
base R을 이용해 하려면 왜 이렇게 복잡하게 해야 하는지 발전과정 같은 걸 알아야되는데,
  이 패키지를 이용하면 그런 것에 신경 쓰지 않고, 핵심 아이디어에 집중할 수 있다.
우선 rlang으로 설명을 하고, 나중에 base R에서는 이걸 어떻게 표현해놨는지에 대해 알아보고.
자동차 오토와 스틱 같은거다. 구구절절한 디테일에 신경쓰기보다는 빅 픽쳐big picture에 집중하도록.
이 책에서는 tidy evaluation의 이론적인 측면에 집중해서, 밑바닥에서부터 어떻게 작동하는지에 대해 충분히 이해하도록.
좀 더 실용적이 소개를 찾고 있다면, 여기 볼 것을 추천한다.

다음의 다섯 개 chapters에서, 메타프로그래밍과 tidy evaluation에 대해 배울 것이다.

Chapter 17 - 전체적인 메타프로그래밍 스토리의 high level 설명하고,
  간단하게 주요 요소들major components에 대해 배움.
그리고 이것들이 유기적인 전체cohesive whole를 어떻게 형성하는지.

Chapter 18 - 모든 R 코드를 하나의 나무tree로 표현할 수 있다는 것을 보여준다.
어떻게 이 나무들을 시각화visualise할 것인지,
어떻게 R의 문법이, 캐릭터들을 일렬로 늘어놓은걸 나무로 변환하는지,
그리고 이 코드 나무들을 작업하는데 어떻게 recursive 함수들을 사용할건지
를 배울 것이다.

Chapter 19 - evaluate되지 않은 함수 인자들arguments을 캡쳐(quote)하는데 사용할 수 있는, rlang 패키지의 도구들을 소개.
또, quasiquotation에 대해 배워볼건데, 얘는 input을 unquote하는 기술들을 제공한다.
  뭐하러 이러냐? 이렇게 함으로써, 코드 조각들fragments에서 쉽게 새로운 나무들trees을 만들 수 있도록.

Chapter 20 - 캡쳐된 코드를 evaluating하는 걸 배워본다.
여기서 quosure라는 중요한 데이터 구조에 대해 배워볼건데, 얘는 정확한 evaluation을 보장ensure해준다.
1. evaluate할 코드를 캡쳐, 2. 이렇게 어디서 evaluate할건지, environment 정하기.
이렇게 2가지를 바탕으로 정확한 evaluation을 보장.
이 chapter에서 배웠던 모든 것들을 바탕으로 base R에서 NSE가 어떻게 작동하는지를,
  subset() 같이 작동하는 함수들을 어떻게 작성할 수 있는지를 배운다.

Chapter 21 - first-class environments, lexical scoping, 메타프로그래밍을 결합해서,
  R 코드를 HTML이나 LaTeX로 어떻게 translate할 수 있는지를 배운다.